﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Manipulations
{
    class Program
    {
        #region VERTICAL
        /*
         * Affiche str en verticale sur la sortie standard
         * 
         *  - Doit etre recursif
         *  - Le curseur doit etre positionne a la ligne pour la prochaine ecriture/lecture
         */
        static void Vertical_rec(String str, int pos)
        {
            Console.WriteLine(str[pos]);
            pos++;
            if (pos<str.Length)
            Vertical_rec(str, pos);
            else
                Console.WriteLine("");
        }

        static void Vertical_iter(String str)
        {
            for (int i = 0; i < str.Length; i++)
            {
                Console.WriteLine(str[i]);
            }
            Console.WriteLine("");
        }

        /*
         * Optimisation de Vertical
         * 
         *  - Retourne la String a afficher sur la sortie standard
         *  - Doit etre recursif
         *  - La String retournee se termine par un "\n"
         *  - Le curseur doit etre positionne a la ligne pour la prochaine ecriture/lecture
         */
        static String Vertical_opti(String str)
        {
            // FIXME

            return ("");
        }
        #endregion

        #region REVERSE
        /*
         * Affiche str de droite a gauche sur la sortie standard
         * 
         *  - Doit etre recursif
         *  - Le curseur doit etre positionne a la ligne pour la prochaine ecriture/lecture
         */
        static void Reverse_rec(string str, int pos)
        { 
            if (pos < str.Length)
            {
                Console.Write(str[str.Length - pos - 1]);
                pos++;
                Reverse_rec(str, pos);
            }
            else
                Console.WriteLine("");
        }

        static void Reverse_iter(string str)
        {
            string reverse = "";

            for (int i = 0; i < str.Length; i++)
            {
                reverse += str[str.Length - i - 1];
            }

            Console.WriteLine(reverse);
            Console.WriteLine("");
        }

        /*
         * Optimisation de Reverse
         * 
         *  - Retourne la String a afficher sur la sortie standard
         *  - Doit etre recursif
         *  - Le curseur doit etre positionne a la ligne pour la prochaine ecriture/lecture
         */
        static String Reverse_opti(string str)
        {
            // FIXME

            return ("");
        }
        #endregion

        #region DIAGONAL
        /*
         * Affiche str en diagonal sur la sortie standard
         * 
         *  - Doit etre recursif
         *  - Le curseur doit etre positionne a la ligne pour la prochaine ecriture/lecture
         */
        static void Diagonal_rec(String str, int pos)
        {
            // FIXME
        }

        static void Diagonal_iter(String str)
        {
            for (int i = 0; i < str.Length; i++)
            {
                for (int j = 0; j < i; j++)
                {
                     Console.Write(" ");
                }

                Console.Write(str[i]);
                Console.WriteLine("");
            }
        }

        /*
         * Optimisation de Diagonal
         * 
         *  - Retourne la String a afficher sur la sortie standard
         *  - Doit etre recursif
         *  - La String retournee se termine par un "\n"
         *  - Le curseur doit etre positionne a la ligne pour la prochaine ecriture/lecture
         *  - Utilisez une fonction d'aide String get_spaces(int i) qui retourne une String composee de i espace(s)
         */
        private static String get_spaces(int n)
        {
            // FIXME

            return ("");
        }

        static String Diagonal_opti(String str)
        {
            // FIXME

            return ("");
        }
        #endregion

        #region DRAW ME A SHEEP
        /*
         * Draw_me_a_sheep
         */
        static void Draw_me_a_sheep()
        {
            // FIXME
        }
        #endregion

        /*
         * Ce main est la pour tester votre code
         * 
         * N'y toucher pas ;)
         */
        static void Main(string[] args)
        {
            Console.Title = "Manipulations";
            Console.WindowHeight = 70;
            Console.ForegroundColor = ConsoleColor.White;
            String test = "Hello World";
            String str;

            #region TEST VERTICAL
            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine("-- VERTICAL REC --");
            Console.ForegroundColor = ConsoleColor.White;
            Vertical_rec(test, 0);

            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine("-- VERTICAL ITER --");
            Console.ForegroundColor = ConsoleColor.White;
            Vertical_iter(test);

            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine("-- VERTICAL OPTI --");
            Console.ForegroundColor = ConsoleColor.White;
            str = Vertical_opti(test);
            Console.WriteLine(str);
            #endregion

            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine("--\nPress ENTER: REVERSE");
            Console.ForegroundColor = ConsoleColor.White;
            Console.ReadKey();
            Console.Clear();

            #region TEST REVERSE
            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine("-- REVERSE REC --");
            Console.ForegroundColor = ConsoleColor.White;
            Reverse_rec(test, 0);

            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine("-- REVERSE ITER --");
            Console.ForegroundColor = ConsoleColor.White;
            Reverse_iter(test);

            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine("-- REVERSE OPTI --");
            Console.ForegroundColor = ConsoleColor.White;
            str = Reverse_opti(test);
            Console.WriteLine(str);
            #endregion

            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine("--\nPress ENTER: DIAGONAL");
            Console.ForegroundColor = ConsoleColor.White;
            Console.ReadKey();
            Console.Clear();

            #region TEST DIAGONAL
            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine("-- DIAGONAL REC --");
            Console.ForegroundColor = ConsoleColor.White;
            Diagonal_rec(test, 0);

            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine("-- DIAGONAL ITER --");
            Console.ForegroundColor = ConsoleColor.White;
            Diagonal_iter(test);

            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine("-- DIAGONAL OPTI --");
            Console.ForegroundColor = ConsoleColor.White;
            str = Diagonal_opti(test);
            Console.WriteLine(str);
            #endregion

            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine("-- END --\n\nDraw me a sheep: Press ENTER");
            Console.ForegroundColor = ConsoleColor.White;
            Console.ReadKey();

            Draw_me_a_sheep();

            Console.ReadKey();
        }
    }
}
